package demo07.Synchronized;
/*
* 卖票案例出现线程安全问题
* 卖出了不存在的票和相同的票，这显然是离谱的
* 解决的一种方案：使用同步代码块
*     格式:
        synchronized(锁对象){
            可能会出现线程安全问题的代码(访问了共享数据的代码)
        }
       注意：
            1.代码块中的锁对象，可以使用任意对象（obj）
            2.但必须保证多个线程使用的锁对象是同一个
            3.锁对象作用：
                    把同步代码块锁住，只让一个线程在其中运行*/
public class RunnableImpl implements Runnable {
    private int ticket=100;
    //创建一个锁对象
    Object object=new Object();
    @Override
    public void run() {
        while (true) {
            //同步代码块
            synchronized (object) {
                if (ticket > 0) {
                    //提高出错概率，小睡一会
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "正在售第" + ticket + "张票");
                    ticket--;
                } else {
                    return;
                }
            }
        }
    }
}
